package ar.edu.utn.frba.disenio.aterrizar.aerolineas;

import java.util.ArrayList;
import ar.edu.utn.frba.disenio.aterrizar.busquedas.CriterioBusqueda;
import ar.edu.utn.frba.disenio.aterrizar.excepciones.*;
import ar.edu.utn.frba.disenio.aterrizar.usuario.Usuario;

import com.lanchita.AerolineaLanchita;
import com.lanchita.excepciones.*;

public class AdapterLanchita extends Aerolinea {
	
	protected AerolineaLanchita aerolinea;
	
	public AdapterLanchita(){
		this.aerolinea = AerolineaLanchita.getInstance();
		this.setRecargoAerolinea(1.15);
	}
	
	public AdapterLanchita(AerolineaLanchita mock){
		this.aerolinea = mock;
		this.setRecargoAerolinea(1.15);
	}
	
	@Override
	public ArrayList<Vuelo> asientosTotales(){
		
		String[][] asientosTotales = aerolinea.asientosDisponibles(null, null, null, null, null, null);
		
		ArrayList<Vuelo> retVal = new ArrayList<Vuelo>();
		
		for(String[] unAsiento : asientosTotales){
			retVal.add(new Vuelo(unAsiento));
        }  
		return retVal;
	}
	
	@Override
	public ArrayList<Vuelo> buscarVuelos(CriterioBusqueda unaBusqueda){
		
		String[][] disponibles = aerolinea.asientosDisponibles(unaBusqueda.origen, unaBusqueda.destino, null, null, null, null);
		ArrayList<Vuelo> retVal = new ArrayList<Vuelo>();
		
		for(String[] unVuelo : disponibles){
			Vuelo vueloAniadir = new Vuelo(unVuelo);
			if(unaBusqueda.fecha.fechaEstasEntre(vueloAniadir.fechaSalida, vueloAniadir.fechaLlegada)){
				retVal.add(vueloAniadir);
			}
			
        }  
		return retVal;
    }
	
	@Override
	public Vuelo buscarVueloParticular(String codigo, Usuario usuario){
		
		ArrayList<Vuelo> asientosTotales = this.asientosTotales();
		
		for(Vuelo unVuelo : asientosTotales){
			if(unVuelo.codigo.equals(codigo)){
				unVuelo.aplicarRecargo(this.recargoAerolinea, usuario.getRecargoUsuario());
				return unVuelo;				 
			}			
        }  
		throw new AsientoErroneoException();
    }

	@Override
	public void comprarAsiento(String codigoAsiento, Usuario unUsuario){
		try
		{
			aerolinea.comprar(codigoAsiento);
		}
		catch(EstadoErroneoException e)
		{
			throw new AsientoNoDisponibleException();
		}
		catch(CodigoErroneoException e){
			throw new AsientoErroneoException();
		}
		
	}
	
	@Override
	public void reservar(String codigoAsiento, Usuario usuario) {
		try
		{
			aerolinea.reservar(codigoAsiento,usuario.getDni());
		}
		catch(EstadoErroneoException e)
		{
			throw new AsientoNoDisponibleException();
		}
	}
}